package org.robert.export_client.excel.util;


import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.robert.export_client.excel.entity.CellStyleEntity;

import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class ExcelUtil {
    /**
     * 导出Excel
     * @param sheetName sheet名称
     * @param title 标题
     * @param values 内容
     * @param wb HSSFWorkbook对象
     * @return
     */
    public static HSSFWorkbook getHSSFWorkbook(String sheetName, String []title, String [][]values, HSSFWorkbook wb){

        // 第一步，创建一个HSSFWorkbook，对应一个Excel文件
        if(wb == null){
            wb = new HSSFWorkbook();
        }

        // 第二步，在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 第四步，创建单元格，并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
       // style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
        //声明列对象
        HSSFCell cell = null;

        //创建标题
        for(int i=0;i<title.length;i++){
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }

        if(values != null){
            //创建内容
            for(int i=0;i<values.length;i++){
                row = sheet.createRow(i + 1);
                for(int j=0;j<values[i].length;j++){
                    //将内容按顺序赋给对应的列对象
                    row.createCell(j).setCellValue(values[i][j]);
                }
            }
        }
        return wb;
    }

    public static HSSFWorkbook createWorkBook(){
        return new HSSFWorkbook();
    }

    public static HSSFSheet createSheet(HSSFWorkbook workbook, String sheetName){
        HSSFSheet sheet= workbook.createSheet(sheetName);//创建sheet并设置sheet名字
        sheet.setDefaultColumnWidth(20);//设置默认列宽
        sheet.setGridsPrinted(true);//设置网格打印
        sheet.setDisplayGridlines(true);//设置显示网格线
        return sheet;
    }

    public static void writeWorkbook(HSSFWorkbook wb,String fileName){
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream(fileName);
            wb.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                if(fos!=null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void setResponse(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        if(StringUtils.isBlank(fileName)){
            fileName = String.valueOf(System.currentTimeMillis());
        }
        if(!fileName.contains(".xlsx") && !fileName.contains(".xls")){
            fileName = fileName + ".xlsx";
        }
        // 这里URLEncoder.encode可以防止中文乱码
        fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName);
        // 这步很重要，需要在给前端返回的请求头中添加Content-Disposition字段，否则前端会取不到Content-Disposition的信息
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    }

    public static CellStyle parseCellStyle(HSSFWorkbook wb, CellStyleEntity styleEntity){
        if(wb == null || styleEntity == null){
            return null;
        }
        // 创建单元格样式
        CellStyle titleStyle = wb.createCellStyle();
        // 默认白色
        // 设置背景色（可选）
        titleStyle.setFillForegroundColor(styleEntity.getBackgroundColor() == null? 1 : styleEntity.getBackgroundColor().getIndex());
        titleStyle.setFillPattern(styleEntity.getFillPatternType() == null? FillPatternType.NO_FILL : styleEntity.getFillPatternType()); // 设置填充方式（可选）

        // 创建字体并设置加粗
        Font boldFont = wb.createFont();
        boldFont.setBold(styleEntity.isBold()); // 设置字体加粗
        boldFont.setFontHeightInPoints(styleEntity.getFontSize()); // 设置字体大小（可选）
        boldFont.setFontName(styleEntity.getFontName());    // 字体
        titleStyle.setFont(boldFont);
        return titleStyle;
    }

    /**
     * 功能：创建HSSFRow
     * @param 	sheet	HSSFSheet
     * @param 	rowNum	int
     * @param 	height	int
     * @return	HSSFRow
     */
    public static HSSFRow createRow(HSSFSheet sheet,int rowNum,int height){
        HSSFRow row=sheet.createRow(rowNum);//根据行号创建行
        row.setHeight((short)height);//设置行高
        return row;
    }

    /**
     * 功能：创建CELL
     * @param 	row		HSSFRow
     * @param 	cellNum	int
     * @param 	style	HSSFStyle
     * @return	HSSFCell
     */
    public static HSSFCell createCell(HSSFRow row,int cellNum,CellStyle style){
        HSSFCell cell=row.createCell(cellNum);
        cell.setCellStyle(style);
        return cell;
    }

    /**
     * 设置列宽（需要换算成poi内置宽度）
     * @param sheet
     * @param columnIndex
     * @param width
     */
    public static void setColumnWidth(HSSFSheet sheet,int columnIndex, int width){
        //换算成poi内置宽度
        sheet.setColumnWidth(columnIndex, width*256+184);
    }

}
